import axios from 'axios'
import { message } from 'ant-design-vue'
import { useAuthStore } from '../stores/auth'

/**
 * API配置模块
 * 负责创建和配置axios实例，处理请求拦截、响应拦截和错误处理
 */

// 创建axios实例
const api = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL || 'http://localhost:8000',
  timeout: 60000, // 60秒超时
})

// 请求拦截器
api.interceptors.request.use(
  (config) => {
    const authStore = useAuthStore()
    if (authStore.token) {
      config.headers.Authorization = `Bearer ${authStore.token}`
    }
    return config
  },
  (error) => {
    return Promise.reject(error)
  }
)

// 响应拦截器
api.interceptors.response.use(
  (response) => {
    return response
  },
  (error) => {
    // 检查是否是token超时或网络错误，避免重复显示提示
    const isAuthError = error.response?.status === 401
    const isNetworkError = !error.response && error.request
    
    // 如果是认证错误，只显示一次提示并跳转到登录页
    if (isAuthError) {
      const authStore = useAuthStore()
      
      // 只在当前不是登录页时显示提示和跳转
      if (window.location.pathname !== '/login') {
        // 使用防重复机制，避免短时间内多次显示相同提示
        if (!window.__lastAuthErrorTime || Date.now() - window.__lastAuthErrorTime > 3000) {
          message.error('认证失败，请重新登录')
          window.__lastAuthErrorTime = Date.now()
        }
        
        authStore.logout()
        window.location.href = '/login'
      }
      return Promise.reject(error)
    }
    
    // 如果是网络错误，只显示一次提示
    if (isNetworkError) {
      // 使用防重复机制，避免短时间内多次显示相同提示
      if (!window.__lastNetworkErrorTime || Date.now() - window.__lastNetworkErrorTime > 3000) {
        message.error('网络连接失败，请检查网络设置')
        window.__lastNetworkErrorTime = Date.now()
      }
      return Promise.reject(error)
    }
    
    // 其他错误处理
    if (error.response) {
      const { status, data } = error.response
      
      switch (status) {
        case 403:
          message.error('权限不足')
          break
        case 404:
          message.error('请求的资源不存在')
          break
        case 500:
          message.error('服务器内部错误')
          break
        default:
          message.error(data.detail || '请求失败')
      }
    } else {
      message.error('请求配置错误')
    }
    
    return Promise.reject(error)
  }
)

// 导出axios实例
export default api